package com.zqh.meta;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.unit.DataUnit;
import cn.hutool.core.util.StrUtil;
import com.zqh.meta.enums.FileGenerateTypeEnum;
import com.zqh.meta.enums.FileTypeEnum;
import com.zqh.meta.enums.ModelTypeEnum;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;

public class MetaValidator {

    public static void doValiteAndFill(Meta meta) {

        // 校验和默认值
        validAndFillMetaRoot(meta);
        // FileConfig 校验和默认值
        validAndFillFileConfig(meta);
        // 基础信息校验和默认值
        validAndFillModelConfig(meta);


    }

    private static void validAndFillModelConfig(Meta meta) {
        // modelConfig 校验和默认值
        Meta.ModelConfig modelConfig = meta.getModelConfig();

        if (modelConfig == null) {
            return;
        }

        List<Meta.ModelConfig.ModelsInfo> modelsInfoList = modelConfig.getModels();
        if (CollectionUtil.isNotEmpty(modelsInfoList)) {

            for (Meta.ModelConfig.ModelsInfo modelsInfo : modelsInfoList) {

                // 如果是group，不用校验
                String groupKey = modelsInfo.getGroupKey();
                if (StrUtil.isNotEmpty(groupKey)) {
                    // 生成中间参数 有分组的列表
                    List<Meta.ModelConfig.ModelsInfo> subModelInfoList = modelsInfo.getModels();

                    String allArgsStr = subModelInfoList
                            .stream()
                            .map(subModelInfo -> String.format("\"--%s\"", subModelInfo.getFieldName()))
                            .collect(Collectors.joining(", "));
                    modelsInfo.setAllArgsStr(allArgsStr);
                    continue;
                }
                // 名称必填
                String fieldName = modelsInfo.getFieldName();
                if (StrUtil.isBlank(fieldName)) {
                    throw new MetaException("未填写 filename");
                }
                // 字段类型 默认值为String
                String modelInfoType = modelsInfo.getType();
                if (StrUtil.isEmpty(modelInfoType)) {
                    modelsInfo.setType(ModelTypeEnum.STRING.getValue());
                }

            }

        }
    }

    private static void validAndFillFileConfig(Meta meta) {
        // FileConfig 校验和默认值
        Meta.FileConfig fileConfig = meta.getFileConfig();

        if (fileConfig == null) {
            return;
        }
        // sourceRootPath必填
        String sourceRootPath = fileConfig.getSourceRootPath();
        if (StrUtil.isBlank(sourceRootPath)) {
            throw new MetaException("未填写 根目录");
        }

        //   "inputRootPath" ： .source + sourceRootPath 的最后一个路径
        String inputRootPath = fileConfig.getInputRootPath();
        String defaultInputRootPath = ".source" + '/' + FileUtil
                .getLastPathEle(Paths.get(sourceRootPath))
                .getFileName()
                .toString();

        if (StrUtil.isEmpty(inputRootPath)) {
            fileConfig.setInputRootPath(defaultInputRootPath);
        }

        // "outputRootPath" ：默认值为当前路径下的 generated
        String outputRootPath = fileConfig.getOutputRootPath();
        String defaultOutputRootPath = "generated";
        if (StrUtil.isEmpty(outputRootPath)) {
            fileConfig.setOutputRootPath(defaultOutputRootPath);
        }

        // "type"
        String fileConfigType = fileConfig.getType();
        String defaultType = "dir";
        if (StrUtil.isEmpty(fileConfigType)) {
            fileConfig.setType(defaultType);
        }


        // FilesInfo默认值
        List<Meta.FileConfig.FilesInfo> filesInfoList = fileConfig.getFiles();
        if (!CollectionUtil.isNotEmpty(filesInfoList)) {
            return;
        }
        for (Meta.FileConfig.FilesInfo filesInfo : filesInfoList) {

            String type = filesInfo.getType();
            if (FileTypeEnum.GROUP.getValue().equals(type)) {
                continue;
            }

            // input 必填
            String inputPath = filesInfo.getInputPath();
            if (StrUtil.isBlank(inputPath)) {
                throw new MetaException("未填写 input");
            }

            //   outPutPath默认值是inputpath
            String outPutPath = filesInfo.getOutputPath();
            if (StrUtil.isBlank(outPutPath)) {
                filesInfo.setOutputPath(inputPath);
            }

//            String type = filesInfo.getType();
            if (StrUtil.isBlank(type)) {
                // 无文件后缀 就是没有.
                if (StrUtil.isBlank(FileUtil.getSuffix(inputPath))) {
                    filesInfo.setType(FileTypeEnum.DiR.getValue());
                } else filesInfo.setType(FileTypeEnum.FILE.getValue());
            }

            // ftl结尾为动态，否则为静态
            String generateType = filesInfo.getGenerateType();
            if (!StrUtil.isBlank(generateType)) {
                continue;
            }
            // 无文件后缀 就是没有.
            if (inputPath.endsWith(".ftl")) {
                filesInfo.setGenerateType(FileGenerateTypeEnum.DYNAMIC.getValue());
            } else filesInfo.setGenerateType(FileGenerateTypeEnum.STATIC.getValue());
        }

    }

    private static void validAndFillMetaRoot(Meta meta) {


        // 基础信息校验和默认值
        String name = StrUtil.blankToDefault(meta.getName(), "my-generator");
        meta.setName(name);

        String description = StrUtil.blankToDefault(meta.getDescription(), "zqh的模板代码生成器");
        meta.setDescription(description);

        String author = StrUtil.blankToDefault(meta.getAuthor(), "zqh");
        meta.setAuthor(author);

        String basePackage = StrUtil.blankToDefault(meta.getBasePackage(), "com.zqh");
        meta.setBasePackage(basePackage);

        String version = StrUtil.blankToDefault(meta.getVersion(), "1.0");
        meta.setVersion(version);

        String createTime = StrUtil.blankToDefault(meta.getCreateTime(), DateUtil.now());
        meta.setCreateTime(createTime);

    }

}
